package org.example.study2;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadFile2 {
    public static void main(String[] args) throws IOException {
        // 1. 直接通过文件路径字符串创建文件输入流，省略了创建File对象的步骤，效果同第一段代码。
        FileInputStream inputStream = new FileInputStream("D:/temp/abc.txt");

        // 2. 创建一个byte数组作为“缓冲区”（Buffer），其大小为1024字节（1KB）。
        //    这个缓冲区就像是一个“水桶”，每次去井里打水（从文件读取数据）不是一勺一勺地打，而是一桶一桶地打。
        byte[] bytes = new byte[1024];

        // 3. 循环读取
        while (true) {
            // 4. 调用read(byte[] b)方法，尝试读取数据并填充整个bytes数组。
            //    这个方法会尝试读取最多b.length个字节（这里是1024个）到数组b中。
            //    返回值int len的含义非常重要：它表示本次实际读取到的字节数量。
            //    它可能等于1024（正好读满一桶），也可能小于1024（文件剩下的内容不足一桶，比如最后只剩200字节），
            //    如果读到文件末尾，没有任何数据可读，则返回-1。
            int len = inputStream.read(bytes);

            // 5. 判断是否读取完毕。如果len == -1，说明上一次读取已经到达文件末尾，本次没有任何数据被读取。
            if (len == -1) {
                // 6. 跳出循环
                break;
            }

            // 7. 处理本次从缓冲区中读取到的数据。注意：这里循环的上限是len，而不是bytes.length(1024)！
            //    因为最后一次读取可能没有填满整个数组，数组后半部分可能还保留着上一次读取的旧数据。
            //    只处理从0到len-1位置的新数据，后面的旧数据是无效的，不能使用。
            for (int i = 0; i < len; i++) {
                // 打印数组中每个有效字节的整数值
                System.out.println(bytes[i]);
            }
        }
        // 8. 关闭流
        inputStream.close();
    }
}
